package com.dkm.orproject.dkmoa.service.serviceimpl;

import com.dkm.orproject.dkmoa.dao.*;
import com.dkm.orproject.dkmoa.domain.*;
import com.dkm.orproject.dkmoa.service.flow.OaEntryAlterationFlowService;
import com.dkm.orproject.utils.utils.IdToobtainUtils;
import com.github.pagehelper.PageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName : OaEntryAlterationFlowServiceImpl  //类名
 * @Description : 人员信息变更服务实现类  //描述
 * @Author : 易嵘  //作者
 * @Date: 2020-11-18 10:11  //时间
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class OaEntryAlterationFlowServiceImpl implements OaEntryAlterationFlowService {

    /**
     * 流程记录
     */
    OaFlowSchedule flowSchedule;

    /**
     * 入职流程Mapper
     */
    @Resource
    OaEntryFlowMapper entryFlowMapper;

    /**
     * 教育经历Mapper
     */
    @Resource
    OaEntryEducationMapper entryEducationMapper;

    /**
     * 家庭成员Mapper
     */
    @Resource
    OaEntryFamilyMapper entryFamilyMapper;

    /**
     * 培训经历Mapper
     */
    @Resource
    OaEntryTrainMapper entryTrainMapper;

    /**
     * 工作经历Mapper
     */
    @Resource
    OaEntryWorkMapper entryWorkMapper;

    /**
     * 紧急联系人Mapper
     */
    @Resource
    OaEmergencyContactMapper emergencyContactMapper;


    /**
     * 人员信息变更Mapper
     */
    @Resource
    OaEntryAlterationFlowMapper entryAlterationFlowMapper;

    /**
     * 人员Mapper
     */
    @Resource
    OaPersonnelMapper personnelMapper;

    /**
     * 通知关联
     */
    @Resource
    OaInformMapper informMapper;

    /**
     * id生成工具类
     */
    @Resource
    IdToobtainUtils idToobtainUtils;

    /**
     * 人事审核通知
     */
    static final String ENTRY_ALTERATION_STAFFING_INFORM = "ENTRY_ALTERATION_STAFFING_INFORM";

    /**
     * 起草流程
     */
    static final Long ENTRY_ALTERATION_STARTS = 780758721671344128L;

    /**
     * 人事审核
     */
    static final Long ENTRY_ALTERATION_STAFFING = 780758775652036608L;

    /**
     * 结束节点
     */
    static final Long ENTRY_ALTERATION_END = 780758815288209408L;


    /**
     * 流程记录日志
     */
    @Resource
    OaFlowScheduleMapper flowScheduleMapper;

    /**
     * 通知Mapper
     */
    @Resource
    OaMessageMapper messageMapper;

    /**
     * 分页查询
     * @param entryAlterationName 人员信息变更名称 用于模糊查询
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 当前页数
     * @param limit 显示行数
     * @return 查询结果
     */
    @Override
    public List<OaEntryAlterationFlow> findAll(String entryAlterationName, String startTime, String endTime, Integer page, Integer limit) {
        PageHelper.startPage(page,limit);
        return entryAlterationFlowMapper.findAll(entryAlterationName,startTime,endTime);
    }

    /**
     * 总行数
     * @param entryAlterationName 人员信息变更名称 用于模糊查询
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 总行数
     */
    @Override
    public Long rowCount(String entryAlterationName, String startTime, String endTime) {
        return entryAlterationFlowMapper.rowCount(entryAlterationName,startTime,endTime);
    }

    /**
     * id查询
     * @param id 人员信息变更id
     * @return 人员信息变更
     */
    @Override
    public OaEntryAlterationFlow findById(Long id) {
        return entryAlterationFlowMapper.selectByPrimaryKey(id);
    }

    /**
     * 起草流程
     * @param entryAlterationFlow 人员信息变更
     * @param personnel 创建人
     * @return 回调函数
     */
    @Override
    public int add(OaEntryAlterationFlow entryAlterationFlow, OaPersonnel personnel) {
        //人员信息变更新增
        entryAlterationFlow.setPkEntryAlterationId(idToobtainUtils.getNumberId());
        entryAlterationFlow.setEntryAlterationName(personnel.getPersonnelName()+"的人员信息变更流程");
        entryAlterationFlow.setIsRevision("R");
        // 流程id 人事审核
        entryAlterationFlow.setEntryAlterationSchedule(ENTRY_ALTERATION_STAFFING);
        //创建人
        entryAlterationFlow.setCreatedBy(personnel.getPersonnelName());

        // 流程记录
        flowSchedule = new OaFlowSchedule();
        // 流程记录id
        flowSchedule.setPkFlowScheduleId(idToobtainUtils.getNumberId());
        // 人员信息变更流程id  起草节点
        flowSchedule.setFlowId(ENTRY_ALTERATION_STARTS);
        // 绑定表单
        flowSchedule.setFormId(entryAlterationFlow.getPkEntryAlterationId());
        // 人员id
        flowSchedule.setPersonnelId(personnel.getPkPersonnelId());
        // 通过原因
        flowSchedule.setFormReason("  ");
        //审核人
        flowSchedule.setCreatedBy(personnel.getPersonnelName());
        // 新增转正流程记录
        flowScheduleMapper.insertSelective(flowSchedule);

        //删除旧通知
        messageMapper.deleteByFormId(entryAlterationFlow.getPkEntryAlterationId());

        // 新建通知
        OaMessage message = new OaMessage();
        //通知id
        message.setPkMessageId(idToobtainUtils.getNumberId());
        //创建人
        message.setCreatedBy(personnel.getPersonnelName());
        //流程id
        message.setFormId(entryAlterationFlow.getPkEntryAlterationId());
        // 通知标题
        message.setMessageName(entryAlterationFlow.getEntryAlterationName());
        //状态 2 待办
        message.setIsRevision("2");
        // 链接地址
        message.setMessageUrl("pages/dkmoa/front/flow/entryAlteration/entryAlterationAudit.html?pkEntryAlterationId=");
        // 新增通知
        messageMapper.insertSelective(message);

        // 根据权限d查询人员
        List<Long> personnelIds = personnelMapper.selectByHover(ENTRY_ALTERATION_STAFFING_INFORM);
        if (personnelIds.size() > 0) {
            // 通知人员关联集合
            List<OaInform> informs = new ArrayList<>();
            // 循环加入通知关联
            for (Long personnelId : personnelIds) {
                // 新建通知关联
                OaInform inform = new OaInform();
                // 通知关联id
                inform.setFkInformId(idToobtainUtils.getNumberId());
                // 设置为未读
                inform.setIsState("0");
                // 通知id
                inform.setMessageId(message.getPkMessageId());
                // 人员id
                inform.setPersonnelId(personnelId);
                // 加入通知关联
                informs.add(inform);
            }
            // 新增通知关联集合
            informMapper.insertAll(informs);
        }
        return entryAlterationFlowMapper.insertSelective(entryAlterationFlow);
    }

    /**
     * 人事通过
     * @param entryAlterationFlow  人员信息变更流程
     * @param personnel 操作人
     * @return 回调函数
     */
    @Override
    public int staffingPass(OaEntryAlterationFlow entryAlterationFlow, OaPersonnel personnel) {
        //设置为结束（有效）
        entryAlterationFlow.setIsRevision("1");
        // 流程id 结束节点
        entryAlterationFlow.setEntryAlterationSchedule(ENTRY_ALTERATION_END);
        int row = entryAlterationFlowMapper.updateByPrimaryKeySelective(entryAlterationFlow);
        entryAlterationFlow= entryAlterationFlowMapper.selectByPrimaryKey(entryAlterationFlow.getPkEntryAlterationId());

        Long entryId = entryAlterationFlow.getEntryId();
        //教育信息修改
        entryEducationMapper.updateAlteration(entryId);
        //教育信息删除
        entryEducationMapper.deleteAlteration(entryId);

        //家庭成员修改
        entryFamilyMapper.updateAlteration(entryId);
        //家庭成员删除
        entryFamilyMapper.deleteAlteration(entryId);

        //培训经历修改
        entryTrainMapper.updateAlteration(entryId);
        //培训经历删除
        entryTrainMapper.deleteAlteration(entryId);

        //工作经历修改
        entryWorkMapper.updateAlteration(entryId);
        //工作经历删除
        entryWorkMapper.deleteAlteration(entryId);

        //紧急联系人修改
        emergencyContactMapper.updateAlteration(entryId);
        //紧急联系人删除
        emergencyContactMapper.deleteAlteration(entryId);

        // 流程记录
        flowSchedule = new OaFlowSchedule();
        // 流程记录id
        flowSchedule.setPkFlowScheduleId(idToobtainUtils.getNumberId());
        // 离职流程id  人事审核
        flowSchedule.setFlowId(ENTRY_ALTERATION_STAFFING);
        // 绑定表单
        flowSchedule.setFormId(entryAlterationFlow.getPkEntryAlterationId());
        // 人员id+
        flowSchedule.setPersonnelId(personnel.getPkPersonnelId());
        // 通过原因
        flowSchedule.setFormReason("  ");
        //审核人
        flowSchedule.setCreatedBy(personnel.getPersonnelName());
        // 新增离职流程记录
        flowScheduleMapper.insertSelective(flowSchedule);

        // 流程记录id
        flowSchedule.setPkFlowScheduleId(idToobtainUtils.getNumberId());
        // 离职流程id  结束节点
        flowSchedule.setFlowId(ENTRY_ALTERATION_END);
        // 新增离职流程记录
        flowScheduleMapper.insertSelective(flowSchedule);

        //删除旧通知
        messageMapper.deleteByFormId(entryAlterationFlow.getPkEntryAlterationId());

        // 新建通知
        OaMessage message = new OaMessage();
        //通知id
        message.setPkMessageId(idToobtainUtils.getNumberId());
        //创建人
        message.setCreatedBy(personnel.getPersonnelName());
        //流程id
        message.setFormId(entryAlterationFlow.getPkEntryAlterationId());
        // 通知标题
        message.setMessageName(entryAlterationFlow.getEntryAlterationName());
        //状态 4 已办
        message.setIsRevision("4");
        // 链接地址
        message.setMessageUrl("pages/dkmoa/front/flow/entryAlteration/entryAlterationAudit.html?show=1&pkEntryAlterationId=");
        // 新增通知
        messageMapper.insertSelective(message);

        // 新建通知关联
        OaInform inform = new OaInform();
        // 通知关联id
        inform.setFkInformId(idToobtainUtils.getNumberId());
        // 设置为未读
        inform.setIsState("0");
        // 通知id
        inform.setMessageId(message.getPkMessageId());
        // 人员id
        inform.setPersonnelId(entryAlterationFlow.getEntryId());
        // 新增通知关联集合
        informMapper.insertSelective(inform);
        return row;
    }

    /**
     * 人事不通过
     * @param entryAlterationFlow  人员信息变更流程
     * @param personnel 操作人
     * @param formReason 不通过原因
     * @return 回调函数
     */
    @Override
    public int staffingNoPass(OaEntryAlterationFlow entryAlterationFlow, OaPersonnel personnel, String formReason) {
        //设置为人事审核
        entryAlterationFlow.setIsRevision("C");
        // 流程id 人事填写
        entryAlterationFlow.setEntryAlterationSchedule(ENTRY_ALTERATION_END);
        int row = entryAlterationFlowMapper.updateByPrimaryKeySelective(entryAlterationFlow);
        entryAlterationFlow= entryAlterationFlowMapper.selectByPrimaryKey(entryAlterationFlow.getPkEntryAlterationId());

        // 流程记录
        flowSchedule = new OaFlowSchedule();
        // 流程记录id
        flowSchedule.setPkFlowScheduleId(idToobtainUtils.getNumberId());
        // 离职流程id  部门审核
        flowSchedule.setFlowId(ENTRY_ALTERATION_STAFFING);
        // 绑定表单
        flowSchedule.setFormId(entryAlterationFlow.getPkEntryAlterationId());
        // 人员id
        flowSchedule.setPersonnelId(personnel.getPkPersonnelId());
        // 不通过原因
        flowSchedule.setFormReason(formReason);
        //审核人
        flowSchedule.setCreatedBy(personnel.getPersonnelName());
        // 新增离职流程记录
        flowScheduleMapper.insertSelective(flowSchedule);

        //删除旧通知
        messageMapper.deleteByFormId(entryAlterationFlow.getPkEntryAlterationId());

        // 新建通知
        OaMessage message = new OaMessage();
        //通知id
        message.setPkMessageId(idToobtainUtils.getNumberId());
        //创建人
        message.setCreatedBy(personnel.getPersonnelName());
        //流程id
        message.setFormId(entryAlterationFlow.getPkEntryAlterationId());
        // 通知标题
        message.setMessageName(entryAlterationFlow.getEntryAlterationName());
        //状态 2 待办
        message.setIsRevision("2");
        // 链接地址
        message.setMessageUrl("pages/dkmoa/front/flow/entryAlteration/entryAlterationForm.html?pkEntryAlterationId=");
        // 新增通知
        messageMapper.insertSelective(message);

        OaEntryFlow entryFlow=entryFlowMapper.selectByPrimaryKey(entryAlterationFlow.getEntryId());

        // 新建通知关联
        OaInform inform = new OaInform();
        // 通知关联id
        inform.setFkInformId(idToobtainUtils.getNumberId());
        // 设置为未读
        inform.setIsState("0");
        // 通知id
        inform.setMessageId(message.getPkMessageId());
        // 人员id
        inform.setPersonnelId(entryFlow.getPersonnelId());

        // 新增通知关联集合
        informMapper.insertSelective(inform);
        return row;
    }

    /**
     * id批量查询
     * @param list 人员信息变更id
     * @return 查询结果
     */
    @Override
    public List<OaEntryAlterationFlow> selectAll(List<Long> list) {
        return entryAlterationFlowMapper.selectAll(list);
    }

    /**
     * 批量删除
     * @param list 人员信息变更id
     * @return 回调函数
     */
    @Override
    public int deleteAll(List<Long> list) {
        return entryAlterationFlowMapper.deleteAll(list);
    }

    /**
     * id删除
     * @param id 人员信息变更id
     * @return 回调函数
     */
    @Override
    public int deleteById(Long id) {
        return entryAlterationFlowMapper.deleteByPrimaryKey(id);
    }
}
